#include <bits/stdc++.h>
using namespace std;
const int N=4e5+50;
const int M=8e5+50;
int n,m,u,v,k;
struct Edge{
    int v,next;
}edge[M];
int cnt,head[N];
void init(){
    cnt=0;
    memset(head,-1,sizeof(head));
}
void addEdge(int u,int v){
    edge[cnt]=Edge{v,head[u]};
    head[u]=cnt++;
    edge[cnt]=Edge{u,head[v]};
    head[v]=cnt++;
}
int p[N];
int find(int x){
    return x==p[x]?x:p[x]=find(p[x]);
}
vector<int> ans;
int del[N];
bool vis[N];
int main(void){
    scanf("%d%d",&n,&m);
    init();
    while(m--){
        scanf("%d%d",&u,&v);
        addEdge(u,v);
    }
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d",&del[i]);
        vis[del[i]]=true;
    }
    for(int i=0;i<n;i++){
        p[i]=i;
    }
    int cnt=n-k;
    //把没删除的点按照边关系连起来，计算连通分量数
    for(int u=0;u<n;u++){
        if(vis[u]){
            continue;
        }
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].v;
            if(!vis[v]){
                int x=find(u);
                int y=find(v);
                if(x!=y){
                    p[x]=y;
                    cnt--;
                }
            }
        }
    }
    ans.push_back(cnt);
    for(int i=k-1;i>=0;i--){
        //把删除的点一个一个还原，多了一个连通分量
        int u=del[i];
        vis[u]=false;
        cnt++;
        for(int i=head[u];i!=-1;i=edge[i].next){
            int v=edge[i].v;
            if(!vis[v]){
                int x=find(u);
                int y=find(v);
                if(x!=y){
                    p[x]=y;
                    cnt--;
                }
            }
        }
        ans.push_back(cnt);
    }
    int l=ans.size();
    for(int i=l-1;i>=0;i--){
        printf("%d\n",ans[i]);
    }
    return 0;
}